const Role = require('../models/roles');
const RoleMenu = require('../models/roles_menus');
const Menu = require('../models/menus');
const Response = require('../utils/response');

/**
 * 权限验证中间件
 * @param {string} permission - 需要的权限标识
 */
const checkPermission = (permission) => {
    return async (ctx, next) => {
        try {
            const user = ctx.state.user;
            if (!user) {
                ctx.status = 401;
                ctx.body = Response.error('未授权访问', 401);
                return;
            }

            // 确保用户有角色信息
            if (!user.role) {
                ctx.status = 403;
                ctx.body = Response.error('用户没有角色信息', 403);
                return;
            }

            // 获取用户角色
            const role = await Role.findOne({ name: user.role });
            if (!role) {
                ctx.status = 403;
                ctx.body = Response.error('无效的角色', 403);
                return;
            }

            // 获取角色的菜单权限
            const roleMenus = await RoleMenu.find({ role_id: role.id });
            const menuIds = roleMenus.map(rm => rm.menu_id);

            // 获取所有按钮权限
            const buttons = await Menu.find({
                id: { $in: menuIds },
                level: 2,  // 按钮级别
                permission: permission  // 匹配权限标识
            });

            // 检查是否有权限
            if (buttons.length === 0) {
                ctx.status = 403;
                ctx.body = Response.error('没有操作权限', 403);
                return;
            }

            // 有权限，继续执行
            await next();
        } catch (error) {
            console.error('权限验证失败:', error);
            ctx.status = 500;
            ctx.body = Response.error('权限验证失败：' + error.message);
        }
    };
};

module.exports = {
    checkPermission
}; 